home *** CD-ROM | disk | FTP | other *** search
- /*
- * MUUCP -- Send mail over uucp, using the UUCP Transmission Format
- *
- * This simply prepends a unix from line of the appropriate form to the
- * message which is then passed on the uux. -Jim Crammond 12/88.
- *
- * usage: muucp [-r] [-gA] -f<from_addr> -H<uucpname> host user1 user2...
- */
- #include <stdio.h>
- #include <sysexits.h>
- #include <sys/types.h>
-
- char uuxcmd[1024] = "/usr/bin/uux -";
-
- char *perc_to_uucp();
- char *tidy_addr();
- char *index();
- char *rindex();
- FILE *popen();
-
- main(argc, argv)
- int argc;
- char *argv[];
- {
- FILE *out;
- char lbuf[BUFSIZ];
- char *From = NULL;
- char *sysname = NULL;
- int i;
- time_t now;
-
- while (argc > 1 && argv[1][0] == '-')
- { switch(argv[1][1])
- {
- case 'f':
- From = &argv[1][2];
- break;
- case 'H':
- sysname = &argv[1][2];
- break;
- case 'r':
- case 'g':
- case 'O':
- case 'x':
- strcat(uuxcmd, " ");
- strcat(uuxcmd, argv[1]);
- break;
- default:
- fprintf(stderr, "unknown flag %s\n", argv[1]);
- break;
- }
- argc--;
- argv++;
- }
-
- if (argc < 3 || From == NULL || sysname == NULL)
- { fprintf(stderr, "usage: muucp -f<From> -H<sysname> host users...\n");
- exit(EX_USAGE);
- }
-
- /* add host!rmail (users) to cmd line */
- strcat(uuxcmd, " ");
- strcat(uuxcmd, argv[1]);
- strcat(uuxcmd, "!rmail '(");
- argc--;
- argv++;
-
- while (--argc > 1)
- { strcat(uuxcmd, argv[1]);
- strcat(uuxcmd, " ");
- argv++;
- }
-
- strcat(uuxcmd, argv[1]);
- strcat(uuxcmd, ")'");
-
- /* open pipe to uux */
- out = popen(uuxcmd, "w");
-
- /* generate the UUCP From line */
- From = perc_to_uucp(From);
- From = tidy_addr(From);
- time(&now);
- fprintf(out, "From %s %.24s remote from %s\n", From, ctime(&now), sysname);
-
- /* pass stdin (mail message) to uux */
- while (fgets(lbuf, sizeof lbuf, stdin))
- fputs(lbuf, out);
-
- /* close pipe */
- i = pclose(out);
- if ((i & 0377) != 0)
- { fprintf(stderr, "pclose: status 0%o\n", i);
- exit(EX_OSERR);
- }
-
- exit((i >> 8) & 0377);
- }
-
-
- /*
- ** PERC_TO_UUCP -- converts an address in Percent style into uucp style
- **
- ** e.g. user%c.bitnet%b.arpa@a.uucp -> a.uucp!b.arpa!c.bitnet!user
- */
- char *
- perc_to_uucp(addr)
- char *addr;
- {
- static char buf[512];
- char *bp = buf;
- char *p;
-
- while ((p = rindex(addr,'@')) != NULL || (p = rindex(addr,'%')) != NULL)
- {
- *p++ = '\0';
- while (*p)
- *bp++ = *p++;
-
- *bp++ = '!';
- }
-
- strcpy(bp, addr);
-
- return(buf);
- }
-
- /*
- ** TIDY_ADDR -- strips duplicate domain names from start of address
- **
- ** e.g. cs.hw.AC.UK!cs.hw.AC.UK!jim -> cs.hw.AC.UK!jim
- */
- char *
- tidy_addr(addr)
- char *addr;
- {
- register char *p, *q;
-
- p = addr;
- while ((q = index(p, '!')) != NULL)
- { ++q;
- while (*p != '!' && *p == *q)
- { p++;
- q++;
- }
- if (*p != '!' && *q != '!')
- break;
-
- addr = ++p;
- }
-
-
- return(addr);
- }
-